package dibujo;

import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Iterator;
import java.util.Vector;

import org.uc3m.ed.interfaz_grafica.ventana.VentanaPrincipal;
import org.uc3m.ed.tad.lista.IListaIterador;
import org.uc3m.ed.tad.lista.ListaEnlazadaCC;

import panel.PanelDibujoLEnlazadaCC;





public class DibujoLista  {

	/**
	 * 
	 */
	private Vector<NodoDibujo> _elementos;
	
	/**
	 * 
	 */
	private NodoCabecera _cabecera; 
	
	/**
	 * 
	 */
	private NodoNulo _nodoNulo;
	
	/**
	 * 
	 */
	private int _desplazamientoX;
	
	/**
	 * 
	 */
	private PanelDibujoLEnlazadaCC _panelDibujo;
	
	/**
	 * 
	 */
	public DibujoLista()
	{
		_elementos=null;
		_cabecera=null;
	}
	
	/**
	 * @param panelDibujoLEnlazada
	 */
	public DibujoLista(PanelDibujoLEnlazadaCC panelDibujoLEnlazada) {
		_elementos=null;
		_cabecera=null;
		_panelDibujo=panelDibujoLEnlazada;
	}


	/**
	 * @param grafico
	 * @param estructura
	 */
	public void dibujar(Graphics grafico, ListaEnlazadaCC<Integer>  estructura) {
		
		try 
		{
			boolean error=false;
			_desplazamientoX=0;
			IListaIterador<Integer> it=null;
			Iterator<NodoDibujo> it2;
			
			if (!estructura.estaVacia())
			{
				_elementos=new Vector<NodoDibujo>();
				it = estructura.iterador();
				if (it == null)
				{
					error=true;
					VentanaPrincipal.getConsola().escribirTextoError("CLASS::LECC::DibujarLista ERROR::1\n   Iterador no creado");
					_panelDibujo.setEstructura(null);
				}
				else
				{
					_nodoNulo=new NodoNulo(grafico);
					_cabecera= new NodoCabecera(grafico.create(),_nodoNulo);
					while(it.haySiguiente())
						_elementos.add(new NodoDibujo(grafico,it.siguiente().toString(),_nodoNulo));
					
					configurarNodos();
					
					it2 = _elementos.iterator();
					while(it2.hasNext())
						it2.next().crearNodo();
	
				}
				
			}
			else
			{
				_nodoNulo=new NodoNulo(grafico);
				_cabecera= new NodoCabecera(grafico,_nodoNulo);
			}
			if (!error)
			{
				configurarNodoNulo();
				configurarCabecera();
				_cabecera.crearCabecera();
				_nodoNulo.crearNodo();
			}
		}catch(Exception e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::LECC::DibujoLista ERROR::2\n   Se ha producido una Excepcion: "+e.toString());
		}catch(Error e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::LECC::DibujoLista ERROR::3\n   Se ha producido un Error: "+e.toString());
		}
		
		
	}
	
	/**
	 * 
	 */
	private void configurarNodoNulo() {
		try
		{
			_nodoNulo.setPosicionX(50);
			_nodoNulo.setPosicionY(100);
		}catch(Exception e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::LECC::DibujoLista ERROR::4\n   Se ha producido una Excepcion: "+e.toString());
		}catch(Error e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::LECC::DibujoLista ERROR::5\n   Se ha producido un Error: "+e.toString());
		}
		
	}

	/**
	 * 
	 */
	private void configurarNodos() {
		try
		{
			int numNodo=1;
			Iterator<NodoDibujo> it=_elementos.iterator();
			NodoDibujo anterior=it.next(),siguiente=null;
			_desplazamientoX=anterior.getAnchoNodo()+40;
			
			anterior.setPosicionX(_nodoNulo.getPosicionX()+_nodoNulo.getAnchoNodo()+_desplazamientoX);
			anterior.setPosicionY(_nodoNulo.getPosicionY());
			anterior.setPosicion(0);
			_nodoNulo.setSiguiente(anterior);
			
				
			while(it.hasNext())
			{
				if ((numNodo==4)||(((numNodo+1)%5)==0&&numNodo!=5))
				{
					siguiente=it.next();
					siguiente.setPosicionX(50);
					siguiente.setPosicionY(anterior.getPosicionY()+anterior.getAltoNodo()+40);
					siguiente.setPosicion(numNodo);
					anterior.setSiguiente(siguiente);
					anterior=siguiente;
					
				}
				else
				{
					siguiente=it.next();
					siguiente.setPosicionX(anterior.getPosicionX()+anterior.getAnchoNodo()+_desplazamientoX);
					siguiente.setPosicionY(anterior.getPosicionY());
					siguiente.setPosicion(numNodo);
					anterior.setSiguiente(siguiente);
					anterior=siguiente;
				}
				
				numNodo++;
				
				if ((anterior.getPosicionX()+anterior.getAnchoNodo()+40)>_panelDibujo.getWidth())
					_panelDibujo.setSize(new Dimension(anterior.getPosicionX()+anterior.getAnchoNodo()+80, _panelDibujo.getHeight()));
				if ((anterior.getPosicionY()+anterior.getAltoNodo()+40)>_panelDibujo.getHeight())
					_panelDibujo.setSize(_panelDibujo.getWidth(), anterior.getPosicionY()+anterior.getAltoNodo()+80);
			}
		}catch(Exception e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::LECC::DibujoLista ERROR::6\n   Se ha producido una Excepcion: "+e.toString());
		}catch(Error e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::LECC::DibujoLista ERROR::7\n   Se ha producido un Error: "+e.toString());
		}
	}
	
	/**
	 * 
	 */
	private void configurarCabecera() {
		try{
			_cabecera.setPosicionX((_panelDibujo.getWidth()/2)-(_cabecera.getAnchoNodo()/2));
			_cabecera.setPosicionY(10);	
		}catch(Exception e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::LECC::DibujoLista ERROR::8\n   Se ha producido una Excepcion: "+e.toString());
		}catch(Error e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::LECC::DibujoLista ERROR::9\n   Se ha producido un Error: "+e.toString());
		}
	
	}
	
	

	


}
